/* Includes ------------------------------------------------------------------*/

#include "tm1638.h"

uint8_t DispTab[4];
uint8_t Update_disp_flg=0;  //更新显示标志

void TM1638_Write(uint8_t DATA) //写数据函数
{
   
   uint8_t i;
   taskENTER_CRITICAL();           //进入临界区
   TM1638_DIO_OUT;
   for(i=0;i<8;i++)
   {
     TM1638_CLK=0;
     delay_xms(1);
     if(DATA&0X01)
     {
       TM1638_DIO_DataOUT=1;
     }
     else
     {
       TM1638_DIO_DataOUT=0;
     }
     DATA>>=1;
     TM1638_CLK=1;
     delay_xms(1);
   }
    taskEXIT_CRITICAL();            //退出临界区
}

uint8_t TM1638_Read(void) //读数据函数
{
  uint8_t i;
  uint8_t temp=0;
  taskENTER_CRITICAL();           //进入临界区
  TM1638_DIO_IN;
  for(i=0;i<8;i++)
  {
    temp>>=1;
    TM1638_CLK=0;
    delay_xms(1);
    if(TM1638_DIO_DataIN==1)
    {
      temp|=0x80;
    }
    TM1638_CLK=1;
    delay_xms(1);
  }
    taskEXIT_CRITICAL();            //退出临界区
  return temp;
}

void Write_COM(uint8_t cmd) //发送命令字
{
  TM1638_STB=0;
  TM1638_Write(cmd);
  TM1638_STB=1;
}

void TM1638_Read_key(uint8_t *KeyValue)
{
     uint8_t i;
     TM1638_STB=0;
     TM1638_Write(0x42);           //读键扫数据 命令 
     delay_xms(10);
     for(i=0;i<4;i++) 
         KeyValue[i]=TM1638_Read();//4个字节数据合成一个字节 
     TM1638_STB=1;           
}

void Write_DATA(uint8_t add,uint8_t DATA) //指定地址写入数据
{
     Write_COM(0x44);      //固定地址
     TM1638_STB=0;
     TM1638_Write(0xc0|add);
     TM1638_Write(DATA);
     TM1638_STB=1;
}

//数据保存到显示缓冲区
void display(uint8_t dig,uint8_t dat)
{
  DispTab[dig]=dat;
}

//显示LED
void display_led(uint8_t dig,uint8_t dat)
{
  Write_DATA(dig,dat);
}

uint8_t Temp[15];
uint8_t DigitalTube[9]={0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
//dig数码管位，seg数码管段，onoff数码管亮灭

void Digital_led(uint8_t dig,uint8_t seg,uint8_t onoff)
{
  if(onoff)Temp[dig]|=DigitalTube[seg];
  else     Temp[dig]&=(~DigitalTube[seg]);
  Write_DATA((0xc0|dig),Temp[dig]);
}

void DigitalTube_led(uint8_t dig,uint8_t seg,uint8_t onoff)
{
  if(onoff)Temp[dig]|=DigitalTube[seg];
  else     Temp[dig]&=(~DigitalTube[seg]);
  Write_DATA((0xc0|dig*2),Temp[dig]);
}

//闪烁
void Flicker(uint8_t n)
{
  uint8_t i;
  for(i=0;i<n;i++)
  {
    display_led(TM1638_GRID1+i*2,0x00);
  }
}



//清除数码管显示
void dispclear(uint8_t n,uint8_t m)
{
  uint8_t i;
  if(m)
  {
     for(i=0;i<n;i++)
     {
         DispTab[i]=0x00;
         display_led(TM1638_GRID1+2*i+1,DispTab[i]);
     }
  }
  else
  {
     n = 4 - n;
     for (i=4; i>n; i--)
     {
         DispTab[i-1]=0x00;
         display_led(TM1638_GRID1+2*i+1,DispTab[i]);
     }        
  }
}

void UpdateDisp(void)    //更新四段数码管显示
{
  uint8_t i;
  for(i=0;i<4;i++)
  {
    display_led(TM1638_GRID1+i*2,DispTab[i]);
  }   
}


 //TM1638初始化函数
void TM1638_Init(void)
{
    
  Write_COM(0x8a);       //亮度 (0x88-0x8f)8级亮度可调
  Write_COM(0x40);       //采用地址自动加1
  TM1638_STB=0;          
  TM1638_Write(0xc0);    //设置起始地址
  for(uint8_t i=0;i<16;i++)      //传送16个字节的数据
  {
    TM1638_Write(0x00);
  }
  TM1638_STB=1;
  
  Write_DATA(0xc8,0x55);
  Write_DATA(0xc8,0xAA);  
  Write_DATA(0xc9,0x01);
  Write_DATA(0xc9,0x02);  
  Write_DATA(0xca,0x55);
  Write_DATA(0xca,0xAA);  
  Write_DATA(0xcb,0x01);
  Write_DATA(0xcb,0x02); 
  
  
}




